/**
 * 
 */
package kr.pe.johnkim.dayve.activity;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import kr.pe.johnkim.dayve.provider.DayveCategory;
import kr.pe.johnkim.dayve.provider.DayveCategoryDatabaseHandler;
import kr.pe.johnkim.dayve.provider.DayveItem;
import kr.pe.johnkim.dayve.provider.DayveItemAmountAdapter;
import kr.pe.johnkim.dayve.provider.DayveItemDatabaseHandler;
import kr.pe.johnkim.dayve.provider.DayveItemEvent;
import kr.pe.johnkim.dayve.provider.DayveItemEventDatabaseHandler;
import kr.pe.johnkim.dayve.provider.DayveLog;
import kr.pe.johnkim.dayve.rest.DayveCommonRest;
import kr.pe.johnkim.dayve.rest.DayveItemEventRest;
import kr.pe.johnkim.dayve.rest.DayveItemRest;
import kr.pe.johnkim.dayve.util.DayveCommon;

import org.json.JSONException;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.DataSetObserver;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemSelectedListener;

/**
 * 아이템 Amount 를 수정하는 클래스이다.
 * 
 * @author johnkim
 *
 */
public class DayveItemAmountView extends ListActivity {

	public static final String TAG = DayveItemAmountView.class.getSimpleName();
	
	ProgressBar itemAmountProgressBar;
	
	private int position = 0;
	
	private String itemId = "";
	private String itemName = "";
	private String itemComment = "";
	private String itemAmount = "";
	private String itemOpenItemYn = "";
	private String itemFavoriteYn = "";
	private String itemActivateYn = "";
	private String itemMyHistoryCategoriesIdMyHistoryCategories = "";
	
	private String DAYVE_ID = "";
	
	private String categoryName = "";
	
	// category name 스피너.
	Spinner spinnerItemAmountCategoryName;
	
	// 업로드 안내문.
	TextView txtViewItemAmountNotification;
	
	// category name 레이아웃.
	LinearLayout linearLayoutItemAmountCategoryName;
	
	// category name 수정 레이아웃.
	LinearLayout linearLayoutItemAmountCategoryNameEdit;
	
	// item name 레이아웃.
	LinearLayout linearLayoutItemAmountItemName;
	
	// item name 수정 레이아웃.
	LinearLayout linearLayoutItemAmountItemNameEdit;
	
	// item comment 레이아웃.
	LinearLayout linearLayoutItemAmountItemComment;
	
	// item comment 수정 레이아웃.
	LinearLayout linearLayoutItemAmountItemCommentEdit;
	
	// item amount 저장 레이아웃.
	LinearLayout linearLayoutItemAmountUpdate;
	
	// item event amount 레이아웃.
	LinearLayout linearLayoutItemEventAmount;
	
	// item event comment 레이아웃.
	LinearLayout linearLayoutItemEventComment;
	
	// item name.
	TextView txtViewItemAmountItemName;
	
	// category name.
	TextView txtViewItemAmountCategoryName;
	
	// item comment.
	TextView txtViewItemAmountItemComment;
	
	// item amount.
	TextView txtViewItemAmount;
	
	// item name 입력 창.
	EditText edtItemAmountItemName;
	
	// item comment 입력 창.
	EditText edtItemAmountItemComment;
	
	// Item Event Comment 입력 창.
	EditText edtTextItemEventComment;
	
	// 수정 버튼.
	ImageView imgViewItemAmountEdit;
	
	// 삭제 버튼.
	ImageView imgViewItemAmountDelete;
	
	// 취소 버튼.
	ImageView imgViewItemAmountBack;
	
	// 저장 버튼.
	ImageView imgViewItemAmountSave;

	ImageView imgViewItemAmountDecrease;
	
	ImageView imgViewItemAmountIncrease;
	
	Button btnItemAmount;
	
	// 현재 시간.
	private String currentDate;
	
	// DatabaseHandler
//	private DatabaseHandler dbHandler;
	
	DayveItemRest dayveItemRest = new DayveItemRest();
	DayveItemEventRest dayveItemEventRest = new DayveItemEventRest();
	DayveCommonRest dayveCommonRest = new DayveCommonRest();
	DayveCommon dayveCommon = new DayveCommon();
	
	// Item Amount 수정 결과.
	private String RESULT_ITEM_AMOUNT_UPDATE = "";

	// Item Amount 를 업데이트 한다.
	private static final int THREAD_ITEM_AMOUNT_UPDATE = 102;

	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 103;

	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 104;

	// Item Amount 업데이트 성공하면 토스트를 띄운다.
	private static final int THREAD_UPDATE_SUCCESS = 105;

	// Item Amount 업데이트 실패하면 오류발생 다이얼로그 창을 띄운다.
	private static final int THREAD_UPDATE_FAIL = 106;

	// Item 을 비활성화 한다.
	private static final int THREAD_ITEM_DEACTIVATE = 110;

	// Item 비활성화에 성공하면 toast 를 띄운다.
	private static final int THREAD_ITEM_DEACTIVATE_SUCCESS = 111;

	// Item 비활성화에 실패하면 dialog 창을 띄운다.
	private static final int THREAD_ITEM_DEACTIVATE_FAIL = 112;
	
	// Item Event 목록을 가져 온다.
	private static final int THREAD_ITEM_EVENT_LIST = 113;
	
	// Item Event 내용을 등록 한다.
	private static final int THREAD_REGISTER_ITEM_EVENT = 114;
	
	// Item Event 목록을 업데이트 한다.
	private static final int THREAD_ITEM_EVENT_UPDATE = 115;
	
	// Item Event 등록 성공.
	private static final int THREAD_ITEM_EVENT_REGISTER_SUCCESS = 116;
	
	// Item Event 등록 실패.
	private static final int THREAD_ITEM_EVENT_REGISTER_FAIL = 117;
	
	// Item Event 등록 결과.
	private String RESULT_ITEM_EVENT_REGISTER = "";

	private String DAYVE_CATEGORY_ID = "";
	
	private String DAYVE_CATEGORY_NAME = "";
	
	private String DAYVE_CATEGORY_ID_SPINNER = "";
	
	private String DAYVE_CATEGORY_NAME_SPINNER = "";
	
	// 최초 amount 값.
	private String INITIAL_AMOUNT = "";
	
	private DayveCategoryDatabaseHandler categoryDatabaseHandler;
	
	private DayveItemEventDatabaseHandler dayveItemEventDatabaseHandler;
	
	private DayveItemAmountAdapter dayveItemAmountAdapter;

	// 데이터 저장용 item 목록
	private ArrayList<DayveItemEvent> itemEventList = null;

	// 화면 출력용 item 목록
	private ArrayList<DayveItemEvent> itemEventViewList = null;
	
	// 호출한 부모 Activity Name.
	private String PARENT_ACTIVITY_NAME = "";
	
	// Spinner 파라메터로 사용할 Category Name.
	private String SPINNER_CATEGORY_NAME = "";
	
	// Spinner 파라메터로 사용할 Category Name Position.
	private int SPINNER_CATEGORY_NAME_POSITION = 0;
	
	public static Activity activity;
	
	public static String RESULT_UPDATE_ITEM_EVENT = "";
	
	private String ITEM_EVENT_MODE = "";

	/* (non-Javadoc)
	 * @see android.app.Activity#onCreate(android.os.Bundle)
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.dayve_item_amount);
		
		activity = this;

		// SharedPreferences 정보를 확인 한다.
		confirmNotification();

		// DatabaseHandler 를 연다.
		categoryDatabaseHandler = DayveCategoryDatabaseHandler.open(getApplicationContext());

		// 현재 시간을 가져 온다.
		currentDate = dayveCommon.getCurrentDate();
		
		Intent i = getIntent();
		
		position = i.getIntExtra("position", 0);
		
		itemId = i.getStringExtra("idMyHistoryItems");
		itemName = i.getStringExtra("name");
		itemComment = i.getStringExtra("comment");
		itemAmount = i.getStringExtra("amount");
		itemOpenItemYn = i.getStringExtra("openItemYn");
		itemFavoriteYn = i.getStringExtra("favoriteYn");
		itemActivateYn = i.getStringExtra("activateYn");
		itemMyHistoryCategoriesIdMyHistoryCategories = i.getStringExtra("myHistoryCategoriesIdMyHistoryCategories");
		DAYVE_CATEGORY_ID = i.getStringExtra("myHistoryCategoriesIdMyHistoryCategories");
		
		PARENT_ACTIVITY_NAME = i.getStringExtra("parent_activity_name");
		
		Log.e(TAG, "itemFavoriteYn : " + itemFavoriteYn);
		
		categoryName = i.getStringExtra("categoryName");
		DAYVE_CATEGORY_NAME = i.getStringExtra("categoryName");
		
		itemAmountProgressBar = (ProgressBar)findViewById(R.id.itemAmountProgressBar);
		
		// 업로드 안내문.
		txtViewItemAmountNotification = (TextView)findViewById(R.id.txtViewItemAmountNotification);
		txtViewItemAmountNotification.setVisibility(View.INVISIBLE);
		
		
		
		linearLayoutItemAmountCategoryName = (LinearLayout)findViewById(R.id.linearLayoutItemAmountCategoryName);
		
		linearLayoutItemAmountCategoryNameEdit = (LinearLayout)findViewById(R.id.linearLayoutItemAmountCategoryNameEdit);
		
		linearLayoutItemAmountItemName = (LinearLayout)findViewById(R.id.linearLayoutItemAmountItemName);
		
		linearLayoutItemAmountItemNameEdit = (LinearLayout)findViewById(R.id.linearLayoutItemAmountItemNameEdit);
		
		linearLayoutItemAmountItemComment = (LinearLayout)findViewById(R.id.linearLayoutItemAmountItemComment);
		
		linearLayoutItemAmountItemCommentEdit = (LinearLayout)findViewById(R.id.linearLayoutItemAmountItemCommentEdit);
		
		linearLayoutItemAmountUpdate = (LinearLayout)findViewById(R.id.linearLayoutItemAmountUpdate);
		
		linearLayoutItemEventAmount = (LinearLayout)findViewById(R.id.linearLayoutItemEventAmount);
		
		linearLayoutItemEventComment = (LinearLayout)findViewById(R.id.linearLayoutItemEventComment);
		
		/**
		 * Spinner 를 정의한다.
		 */
		spinnerItemAmountCategoryName = (Spinner)findViewById(R.id.spinnerItemAmountCategoryName);
		
		// Spinner 에 출력할 category 목록을 가져 온다.
		ArrayList<DayveCategory> categoryList = categoryDatabaseHandler.selectCategoryList("" + 0, "" + 10000);
		
		categoryDatabaseHandler.close();
		
		Log.i(TAG, "categoryList.size() : " + categoryList.size());
		
		// Item 이 속한 Category Name 을 비교해서 Spinner 초기값을 세팅하기 위해서 position 을 구한다.
		for(int j=0 ; j<categoryList.size() ; j++) {
			if((categoryName).equals(categoryList.get(j).getName())) {
				SPINNER_CATEGORY_NAME_POSITION = j;
			}
		}
		
		GroupSpinnerAdapter groupSpinnerAdapter = new GroupSpinnerAdapter(categoryList);
		
		spinnerItemAmountCategoryName.setAdapter(groupSpinnerAdapter);
		
		// 초기값을 세팅 한다.
		spinnerItemAmountCategoryName.setSelection(SPINNER_CATEGORY_NAME_POSITION);
		
		spinnerItemAmountCategoryName.setOnItemSelectedListener(new OnItemSelectedListener() {

			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
				// TODO Auto-generated method stub
				DayveCategory dayveCatgegory = (DayveCategory)parent.getItemAtPosition(position);
//				Toast.makeText(getApplicationContext(), 
//						"group id   : " + dayveGroup.getIdMyHistoryGroups() + "\n" + 
//						"group name : " + dayveGroup.getName(), Toast.LENGTH_SHORT).show();
				
				// Group id, name 을 세팅 한다.
				itemMyHistoryCategoriesIdMyHistoryCategories = dayveCatgegory.getIdMyHistoryCategories();
				categoryName = dayveCatgegory.getName();
				
				DAYVE_CATEGORY_ID_SPINNER = dayveCatgegory.getIdMyHistoryCategories();
				DAYVE_CATEGORY_NAME_SPINNER = dayveCatgegory.getName();
				
				Log.i(TAG, "DAYVE_CATEGORY_ID_SPINNER   : " + DAYVE_CATEGORY_ID_SPINNER);
				Log.i(TAG, "DAYVE_CATEGORY_NAME_SPINNER : " + DAYVE_CATEGORY_NAME_SPINNER);
			}

			public void onNothingSelected(AdapterView<?> arg0) {
				// TODO Auto-generated method stub
				
			}
			
		});

		/**
		 * 수정 버튼을 정의한다.
		 * 
		 * 수정 모드로 바뀐다.
		 */
		imgViewItemAmountEdit = (ImageView)findViewById(R.id.imgViewItemAmountEdit);
		imgViewItemAmountEdit.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				linearLayoutItemAmountCategoryName.setVisibility(View.INVISIBLE);
				linearLayoutItemAmountCategoryNameEdit.setVisibility(View.VISIBLE);
				
				linearLayoutItemAmountItemName.setVisibility(View.INVISIBLE);
				linearLayoutItemAmountItemNameEdit.setVisibility(View.VISIBLE);
				
				linearLayoutItemAmountItemComment.setVisibility(View.INVISIBLE);
				linearLayoutItemAmountItemCommentEdit.setVisibility(View.VISIBLE);
				
				linearLayoutItemAmountUpdate.setVisibility(View.INVISIBLE);
				
				linearLayoutItemEventAmount.setVisibility(View.INVISIBLE);
				linearLayoutItemEventComment.setVisibility(View.INVISIBLE);
			}
			
		});
		
		/**
		 * 삭제 버튼을 정의 한다.
		 * 
		 * 삭제 확인 dialog 창을 띄운다.
		 */
		imgViewItemAmountDelete = (ImageView)findViewById(R.id.imgViewItemAmountDelete);
		imgViewItemAmountDelete.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				new AlertDialog.Builder(DayveItemAmountView.this)
				.setTitle("아이템 삭제 확인.")
				.setMessage(txtViewItemAmountItemName.getText().toString().trim() + " 아이템을 삭제 하시겠습니까?")
				.setPositiveButton("확인", 
					new DialogInterface.OnClickListener() {
						
//						@Override
						public void onClick(DialogInterface dialog, int which) {
							// TODO Auto-generated method stub
							mHandler.sendMessage(mHandler.obtainMessage(THREAD_ITEM_DEACTIVATE));
						}
					})
				.setNegativeButton("취소", new DialogInterface.OnClickListener() {
					
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
					}
				})
				.show();
			}
			
		});
		
		/**
		 * 뒤로가기(취소) 버튼을 정의 한다.
		 * 
		 * 일반 모드로 바뀐다.
		 */
		imgViewItemAmountBack = (ImageView)findViewById(R.id.imgViewItemAmountBack);
		imgViewItemAmountBack.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				linearLayoutItemAmountCategoryName.setVisibility(View.VISIBLE);
				linearLayoutItemAmountCategoryNameEdit.setVisibility(View.INVISIBLE);
				
				linearLayoutItemAmountItemName.setVisibility(View.VISIBLE);
				linearLayoutItemAmountItemNameEdit.setVisibility(View.INVISIBLE);
				
				linearLayoutItemAmountItemComment.setVisibility(View.VISIBLE);
				linearLayoutItemAmountItemCommentEdit.setVisibility(View.INVISIBLE);
				
				linearLayoutItemAmountUpdate.setVisibility(View.VISIBLE);
				
				linearLayoutItemEventAmount.setVisibility(View.VISIBLE);
				linearLayoutItemEventComment.setVisibility(View.VISIBLE);
				
				// 열려진 soft keyboard 를 닫는다.
				InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
				imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
			}
			
		});
		
		/**
		 * 저장 버튼을 정의 한다.
		 * 
		 * 수정한 내용을 업데이트 한다.
		 */
		imgViewItemAmountSave = (ImageView)findViewById(R.id.imgViewItemAmountSave);
		imgViewItemAmountSave.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_ITEM_AMOUNT_UPDATE));
			}
			
		});
		
		/**
		 * 처음 일반 모드로 화면이 로딩 된다.
		 */
		linearLayoutItemAmountCategoryName.setVisibility(View.VISIBLE);
		linearLayoutItemAmountCategoryNameEdit.setVisibility(View.INVISIBLE);
		
		linearLayoutItemAmountItemName.setVisibility(View.VISIBLE);
		linearLayoutItemAmountItemNameEdit.setVisibility(View.INVISIBLE);
		
		linearLayoutItemAmountItemComment.setVisibility(View.VISIBLE);
		linearLayoutItemAmountItemCommentEdit.setVisibility(View.INVISIBLE);
		
		linearLayoutItemAmountUpdate.setVisibility(View.VISIBLE);

		// item name 입력창을 정의 한다.
		edtItemAmountItemName = (EditText)findViewById(R.id.edtTextItemAmountItemName);
		edtItemAmountItemName.setText(itemName);
		
		// item comment 입력창을 정의 한다.
		edtItemAmountItemComment = (EditText)findViewById(R.id.edtTextItemAmountItemComment);
		edtItemAmountItemComment.setText(itemComment);
		
		InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
		imm.hideSoftInputFromWindow(edtItemAmountItemComment.getWindowToken(), InputMethodManager.SHOW_FORCED);
		
		// item name 을 설정 한다.
		txtViewItemAmountItemName = (TextView)findViewById(R.id.txtViewItemAmountItemName);
		txtViewItemAmountItemName.setText("  " + itemName + "  ");
		
		// item 이 속해 있는 category name 을 설정 한다.
		txtViewItemAmountCategoryName = (TextView)findViewById(R.id.txtViewItemAmountCategoryName);
		txtViewItemAmountCategoryName.setText("  " + categoryName + "  ");
		
		// item comment 를 설정 한다.
		txtViewItemAmountItemComment = (TextView)findViewById(R.id.txtViewItemjAmountItemComment);
		txtViewItemAmountItemComment.setText(itemComment);
		
		// item amount 를 설정 한다.
		txtViewItemAmount = (TextView)findViewById(R.id.txtViewItemAmount);
		txtViewItemAmount.setText("  " + itemAmount + "  ");
		
		imgViewItemAmountDecrease = (ImageView)findViewById(R.id.imgViewItemAmountDecrease);
		
		imgViewItemAmountIncrease = (ImageView)findViewById(R.id.imgViewItemAmountIncrease);
		
		edtTextItemEventComment = (EditText)findViewById(R.id.edtTextItemEventComment);
		
		// 최초 amount 값을 세팅 한다.
		INITIAL_AMOUNT = itemAmount;
		
		// Amount 감소 버튼을 터치 한다.
		imgViewItemAmountDecrease.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Log.i(TAG, "btnItemAmountDecrease");
				int amount = Integer.parseInt(itemAmount);
				amount--;
				
				if(amount < 0) {
					amount = 0;
				}
				
				itemAmount = "" + amount;
				txtViewItemAmount.setText("  " + itemAmount + "  ");
			}
			
		});
		
		// Amount 증가 버튼을 터치 한다.
		imgViewItemAmountIncrease.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.i(TAG, "btnItemAmountIncrease");
				int amount = Integer.parseInt(itemAmount);
				amount++;
				itemAmount = "" + amount;
				txtViewItemAmount.setText("  " + itemAmount + "  ");
			}
			
		});
		
		/**
		 * enter 버튼을 터치 한다.
		 * 
		 * 아이템 amount 업데이트가 성공하면 아이템 이벤트도 등록 한다.
		 */
		btnItemAmount = (Button)findViewById(R.id.btnItemAmount);
		btnItemAmount.setOnClickListener(new View.OnClickListener() {

			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				
				// 아이템 이벤트가 등록되는 모드임을 설정 한다.
				ITEM_EVENT_MODE = "YES";
				
				// 버튼을 터치 할 때 현재 시간을 다시 가져 온다.
				currentDate = dayveCommon.getCurrentDate();
				
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_ITEM_AMOUNT_UPDATE));
				// 로직변경에 따라 주석 처리 함. 20120406
//				mHandler.sendMessage(mHandler.obtainMessage(THREAD_REGISTER_ITEM_EVENT));
//				mHandler.sendMessage(mHandler.obtainMessage(THREAD_ITEM_EVENT_UPDATE));
			}
			
		});
		
		itemEventViewList = new ArrayList<DayveItemEvent>();

//		dayveItemEventDatabaseHandler = DayveItemEventDatabaseHandler.open(getApplicationContext());
//		itemEventViewList = dayveItemEventDatabaseHandler.selectItemEventList(itemId);
//		dayveItemEventDatabaseHandler.close();
//		
//		Log.e(TAG, "> itemEventViewList.size() : " + itemEventViewList.size());
//		
//		if(itemEventViewList.size() < 1) {
//			showNoListToast();
//		}
		
//		mHandler.sendMessage(mHandler.obtainMessage(THREAD_ITEM_EVENT_LIST));
		
		dayveItemAmountAdapter = new DayveItemAmountAdapter(getApplicationContext(), itemEventViewList);
		
		setListAdapter(dayveItemAmountAdapter);
		
		getListView().setAlwaysDrawnWithCacheEnabled (true);

	}
	
	/**
	 * SharedPreferences 정보를 확인 한다.
	 */
	public void confirmNotification() {
		String myPf = "kr.pe.johnkim.dayve.activity_preferences";
		SharedPreferences mSharedPreferences = getSharedPreferences(myPf, Activity.MODE_PRIVATE);
		
		// id 를 가져 온다.
		DAYVE_ID = mSharedPreferences.getString("dayve_id", "");
	}
	
	/**
	 * Group 선택 Spinner 에 세팅하기 위한 어댑터 클래스를 정의 한다.
	 * 
	 * @author johnkim
	 *
	 */
	private class GroupSpinnerAdapter implements SpinnerAdapter {
		
		ArrayList<DayveCategory> data;
		
		public GroupSpinnerAdapter(ArrayList<DayveCategory> data) {
			this.data = data;
		}

		public int getCount() {
			// TODO Auto-generated method stub
			return data.size();
		}

		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return data.get(position);
		}

		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		public int getItemViewType(int position) {
			// TODO Auto-generated method stub
			return android.R.layout.simple_spinner_dropdown_item;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			
//			if (convertView == null) {
//			    LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//			    convertView = vi.inflate(android.R.layout.simple_spinner_dropdown_item, null);
//			}
			
			TextView textView = new TextView(getApplicationContext());
			
			textView.setTextSize(24);
			textView.setTextColor(Color.BLACK);
			textView.setText("  " + data.get(position).getName());
			textView.setSingleLine(true);
			
//			convertView = textView;
			
			return textView;
		}

		public int getViewTypeCount() {
			// TODO Auto-generated method stub
			return 1;
		}

		public boolean hasStableIds() {
			// TODO Auto-generated method stub
			return false;
		}

		public boolean isEmpty() {
			// TODO Auto-generated method stub
			return false;
		}

		public void registerDataSetObserver(DataSetObserver observer) {
			// TODO Auto-generated method stub
			
		}

		public void unregisterDataSetObserver(DataSetObserver observer) {
			// TODO Auto-generated method stub
			
		}
		
		public View getDropDownView(int position, View convertView,
				ViewGroup parent) {
			// TODO Auto-generated method stub
//			if (convertView == null) {
//			    LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//			    convertView = vi.inflate(android.R.layout.simple_spinner_dropdown_item, null);
//			}
//			
//			TextView textView = new TextView(getApplicationContext());
//			
//			textView.setTextSize(18);
//			textView.setTextColor(Color.BLACK);
//			textView.setText("  " + data.get(position).getName());
//			
//			convertView = textView;
			
			return this.getView(position, convertView, parent);
		}
		
	}
	
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		// TODO Auto-generated method stub
		super.onListItemClick(l, v, position, id);
		
		Log.i(TAG, "onListItemClick RESULT_UPDATE_ITEM_EVENT : " + RESULT_UPDATE_ITEM_EVENT);
		
		/**
		 * refresh 가 종료되면 목록 선택이 가능 하다.
		 */
		if(("").equals(RESULT_UPDATE_ITEM_EVENT)) {
			Intent i = new Intent(this, DayveItemEventModifyView.class);
			
			i.putExtra("idMyHistoryItemEvents", itemEventViewList.get(position).getIdMyHistoryItemEvents());
			i.putExtra("comment", itemEventViewList.get(position).getComment());
			i.putExtra("amount", itemEventViewList.get(position).getAmount());
			i.putExtra("openItemEventYn", itemEventViewList.get(position).getOpenItemEventYn());
			i.putExtra("favoriteYn", itemEventViewList.get(position).getFavoriteYn());
			i.putExtra("activateYn", itemEventViewList.get(position).getActivateYn());
			i.putExtra("modifyDate", itemEventViewList.get(position).getModifyDate());
			i.putExtra("myHistoryMembersId", itemEventViewList.get(position).getMyHistoryMembersId());
			i.putExtra("myHistoryItemsIdMyHistoryItems", itemEventViewList.get(position).getMyHistoryItemsIdMyHistoryItems());
			
			startActivityForResult(i, 0);
		}
	}
	
	/**
	 * Handler 를 등록 한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			// Item Amount 를 업데이트 한다.
			case THREAD_ITEM_AMOUNT_UPDATE : 
				threadUpdateItem();
				break;
			// 프로그레스 바를 출력 한다.
			case THREAD_PROGRESS_BAR_VISIBLE : 
				itemAmountProgressBar.setVisibility(View.VISIBLE);
				txtViewItemAmountNotification.setVisibility(View.VISIBLE);
				break;
			// 프로그레스 바를 감춘다.
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				itemAmountProgressBar.setVisibility(View.INVISIBLE);
				txtViewItemAmountNotification.setVisibility(View.INVISIBLE);
				break;
			// Item Amount 업데이트 성공하면 토스트를 띄운다.
			case THREAD_UPDATE_SUCCESS : 
				showUpdateItemToast();
				break;
			// Item Amount 업데이트 실패하면 오류발생 다이얼로그 창을 띄운다.
			case THREAD_UPDATE_FAIL : 
				showDialogRegisterCategoryFail();
				break;
			// Item 을 비활성화 한다.
			case THREAD_ITEM_DEACTIVATE : 
				threadUpdateDeactivateItem();
				break;
			// Item 비활성화에 성공하면 toast 를 띄운다.
			case THREAD_ITEM_DEACTIVATE_SUCCESS : 
				break;
			// Item 비활성화에 실패하면 dialog 를 띄운다.
			case THREAD_ITEM_DEACTIVATE_FAIL : 
				break;
			// Item Event 목록을 가져 온다.
			case THREAD_ITEM_EVENT_LIST : 
				itemEventViewList.clear();
				
				runOnUiThread(selectItemEventList);
				
//				itemEventViewList = new ArrayList<DayveItemEvent>();
				
//				Log.e(TAG, "itemId : " + itemId);
//				
//				dayveItemEventDatabaseHandler = DayveItemEventDatabaseHandler.open(getApplicationContext());
//				itemEventViewList = dayveItemEventDatabaseHandler.selectItemEventList(itemId);
//				dayveItemEventDatabaseHandler.close();
//				
//				if(itemEventViewList.size() < 1) {
//					showNoListToast();
//				}
				
				break;
			// Item Event 를 등록 한다.
			case THREAD_REGISTER_ITEM_EVENT : 
				threadRegisterItemEvent();
				break;
			// Item Event 를 업데이트 한다.
			case THREAD_ITEM_EVENT_UPDATE : 
				threadUpdateItemEventList();
				break;
			// Item Event 등록 성공.
			case THREAD_ITEM_EVENT_REGISTER_SUCCESS : 
				break;
			// Item Event 등록 실패.
			case THREAD_ITEM_EVENT_REGISTER_FAIL : 
				break;
			}
		}
	};
	
	/**
	 * Item 을 수정 한다.
	 * 
	 * 실제 로직은 updateItem 메소드에서 처리한다.
	 * 쓰레드로 돌리기 위한 임시 메소드 이다.
	 */
	private void threadUpdateItem() {
		Log.i(TAG, "threadRegisterCategory");
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				updateItem();
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * Item Amount 를 업데이트 한다.
	 */
	private void updateItem() {
		Log.i(TAG, "updateItem");
		
		DayveItem parameterItem = new DayveItem();
		
		parameterItem.setIdMyHistoryItems(itemId);
		parameterItem.setName(edtItemAmountItemName.getText().toString().trim());
		parameterItem.setComment(edtItemAmountItemComment.getText().toString().trim());
		parameterItem.setAmount(txtViewItemAmount.getText().toString().trim());
		parameterItem.setOpenItemYn(itemOpenItemYn);
		parameterItem.setFavoriteYn(itemFavoriteYn);
		parameterItem.setActivateYn(itemActivateYn);
		parameterItem.setModifyDate(currentDate);
		parameterItem.setMyHistoryMembersId(DAYVE_ID);
		
		/**
		 * 수정 모드일때는 Spinner 에서 선택한 category id 를, 
		 * 일반 모드일때는 부모창에서 넘어온 category id 를 세팅 한다.
		 */
		if(linearLayoutItemAmountCategoryNameEdit.isShown()) {
			parameterItem.setMyHistoryCategoriesIdMyHistoryCategories(DAYVE_CATEGORY_ID_SPINNER);
		} else {
			parameterItem.setMyHistoryCategoriesIdMyHistoryCategories(DAYVE_CATEGORY_ID);
		}
		
//		parameterItem.setMyHistoryCategoriesIdMyHistoryCategories(DAYVE_CATEGORY_ID);
		
		try {
			RESULT_ITEM_AMOUNT_UPDATE = dayveItemRest.updateItem(parameterItem).getResult();
			
//			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		}
		
		/**
		 * 등록 결과에 따라서 다이얼로그 창을 띄운다.
		 * 
		 * 등록에 성공하면 등록화면을 닫고 카테고리 목록 화면으로 이동 한다.
		 * 등록에 실패하면 다이얼로그 창을 띄워서 다시 등록할 것인지 확인 한다.
		 */
		if(("SUCCESS").equals(RESULT_ITEM_AMOUNT_UPDATE)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_UPDATE_SUCCESS));
			
			/**
			 * ITEM_EVENT_MODE 값이 YES 이면 amount 업데이트 중이기 때문에, 
			 * 만약 item amount 업데이트에 성공하면 item event 로 등록 한다. 
			 * 
			 * 20120406 추가.
			 */
			if(("YES").equals(ITEM_EVENT_MODE)) {
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_REGISTER_ITEM_EVENT));
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_ITEM_EVENT_UPDATE));
			}
			
//			DayveCategoryView.RESULT_CATEGORY_REGISTER = "SUCCESS";
//			DayveItemView.RESULT_ITEM_REGISTER = "SUCCESS";

			// 호출한 부모 activity 의 파라메터를 세팅 한다.
			if(("DayveItemView").equals(PARENT_ACTIVITY_NAME)) {
				DayveItemView.RESULT_ITEM_REGISTER = "SUCCESS";
			} else if(("DayveCategoryAnalysisView").equals(PARENT_ACTIVITY_NAME)) {
				DayveCategoryAnalysisView.RESULT_ITEM_REGISTER = "SUCCESS";
			}

			Intent i = new Intent();
			setResult(RESULT_OK, i);
			
			/**
			 * category 를 등록한뒤 intent 로 생성하면 main 페이지가 사라진다.
			 * 등록 성공하면 본 register 페이지만 닫는다.
			 */
			// category 목록 화면으로 이동 한다.
//			Intent dayveMainView = new Intent(DayveCategoryRegisterView.this, DayveCategoryView.class);
//			startActivity(dayveMainView);
			
			// 화면을 닫기 직전에 프로그레스 바를 감춘다.
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
			
			// 화면을 닫는다.
			finish();
		} else {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_UPDATE_FAIL));
		}
		
		ITEM_EVENT_MODE = "";
	}
	
	/**
	 * Item Amount 업데이트 성공 Toast 를 띄운다.
	 */
	private void showUpdateItemToast() {
		CharSequence text = "Amount 업데이트 성공";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/**
	 * Item Amount 업데이트 실패 다이얼로그 창을 띄운다.
	 */
	private void showDialogRegisterCategoryFail() {
		Log.e(TAG, "showDialogRegisterCategoryFail");
		
		new AlertDialog.Builder(DayveItemAmountView.this)
		.setTitle("Amount 업데이트 확인.")
		.setMessage("Amount 업데이트에 실패 했습니다." + "\n" + "다시 시도해 주시기 바랍니다.")
		.setPositiveButton("확인", 
			new DialogInterface.OnClickListener() {
				
//				@Override
				public void onClick(DialogInterface dialog, int which) {
					// TODO Auto-generated method stub
				}
			}).show();
	}
	
	/**
	 * Item 을 비활성화 한다.
	 * 
	 * 실제 로직은 updateItem 메소드에서 처리한다.
	 * 쓰레드로 돌리기 위한 임시 메소드 이다.
	 */
	private void threadUpdateDeactivateItem() {
		Log.i(TAG, "threadUpdateDeactivateItem");
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				updateDeactivateItem();
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * Item 을 비활성화 한다.
	 */
	private void updateDeactivateItem() {
		Log.i(TAG, "updateDeactivateItem");
		
		DayveItem parameterItem = new DayveItem();
		
		parameterItem.setIdMyHistoryItems(itemId);
		parameterItem.setActivateYn("N");
		parameterItem.setModifyDate(currentDate);
		parameterItem.setMyHistoryMembersId(DAYVE_ID);
		
		try {
			RESULT_ITEM_AMOUNT_UPDATE = dayveItemRest.updateDeactivateItem(parameterItem).getResult();
			
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		}
		
		/**
		 * 등록 결과에 따라서 다이얼로그 창을 띄운다.
		 * 
		 * 등록에 성공하면 등록화면을 닫고 카테고리 목록 화면으로 이동 한다.
		 * 등록에 실패하면 다이얼로그 창을 띄워서 다시 등록할 것인지 확인 한다.
		 */
		if(("SUCCESS").equals(RESULT_ITEM_AMOUNT_UPDATE)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_UPDATE_SUCCESS));
			
//			DayveCategoryView.RESULT_CATEGORY_REGISTER = "SUCCESS";
//			DayveItemView.RESULT_ITEM_REGISTER = "SUCCESS";

			// 호출한 부모 activity 의 파라메터를 세팅 한다.
//			if(("DayveItemView").equals(PARENT_ACTIVITY_NAME)) {
//				DayveItemView.RESULT_ITEM_REGISTER = "SUCCESS";
//			} else if(("DayveCategoryAnalysisView").equals(PARENT_ACTIVITY_NAME)) {
//				DayveCategoryAnalysisView.RESULT_ITEM_REGISTER = "SUCCESS";
//			}
			
			DayveItemView.RESULT_ITEM_REGISTER = "SUCCESS";
			DayveCategoryAnalysisView.RESULT_ITEM_REGISTER = "SUCCESS";
			DayveCategoryView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			DayveFavoriteView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			
			DayveCategoryView.ACTIVITY_RESULT = "";
			
			Intent i = new Intent();
			setResult(RESULT_OK, i);

			// 화면을 닫기 직전에 프로그레스 바를 감춘다.
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
			
			// 화면을 닫는다.
			finish();
		} else {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_UPDATE_FAIL));
		}
	}
	
	/**
	 * Item Event 를 등록 한다.
	 * 
	 * 실제 로직은 registerItemEvent 메소드에서 처리한다.
	 * 쓰레드로 돌리기 위한 임시 메소드 이다.
	 */
	private void threadRegisterItemEvent() {
		Log.i(TAG, "threadRegisterItemEvent");
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				registerItemEvent();
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * Item Event 를 등록 한다.
	 * 
	 * 새롭게 입력한 amount 의 값을 event amount 에 세팅 한다.
	 */
	private void registerItemEvent() {
		Log.i(TAG, "registerItemEvent");
		
		String itemEventComment = "";
		
		if(("").equals(edtTextItemEventComment.getText().toString().trim())) {
			itemEventComment = itemName;
		} else {
			itemEventComment = edtTextItemEventComment.getText().toString().trim();
		}
		
		int amount = 0;
		
		int init = Integer.parseInt(INITIAL_AMOUNT);
		int count = Integer.parseInt(txtViewItemAmount.getText().toString().trim());
		
		String amountString = "";
		
		/**
		 * Amount 를 계산한다.
		 * 마이너스일 경우 앞에 '-' 를 붙인다.
		 */
		if(init > count) {
			amount = init - count;
			amountString = "-" + amount;
		} else if(init < count) {
			amount = count - init;
			amountString = amount + "";
		} else {
			amount = 0;
			amountString = "0";
		}
		
		Log.i(TAG, ">> START AMOUNT : " + init);
		Log.i(TAG, ">> END AMOUNT   : " + count);
		Log.i(TAG, ">> AMOUNT       : " + amount);
		
		DayveItemEvent parameterItemEvent = new DayveItemEvent();
		
		parameterItemEvent.setComment(itemEventComment);
		parameterItemEvent.setAmount(amountString);
		parameterItemEvent.setOpenItemEventYn("N");
		parameterItemEvent.setFavoriteYn("N");
		parameterItemEvent.setActivateYn("Y");
		parameterItemEvent.setModifyDate(currentDate);
		parameterItemEvent.setRegisterDate(currentDate);
		parameterItemEvent.setMyHistoryMembersId(DAYVE_ID);
		parameterItemEvent.setMyHistoryItemsIdMyHistoryItems(itemId);
		
		try {
//			RESULT_ITEM_REGISTER = dayveItemRest.registerItem(parameterItemEvent).getResult();
			RESULT_ITEM_EVENT_REGISTER = dayveItemEventRest.registerItemEvent(parameterItemEvent).getResult();
			
			Log.i(TAG, "RESULT_ITEM_EVENT_REGISTER" + RESULT_ITEM_EVENT_REGISTER);
			
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		}
		
		/**
		 * 등록 결과에 따라서 다이얼로그 창을 띄운다.
		 * 
		 * 등록에 성공하면 등록화면을 닫고 카테고리 목록 화면으로 이동 한다.
		 * 등록에 실패하면 다이얼로그 창을 띄워서 다시 등록할 것인지 확인 한다.
		 */
		if(("SUCCESS").equals(RESULT_ITEM_EVENT_REGISTER)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_ITEM_EVENT_REGISTER_SUCCESS));
			
			Log.e(TAG, ">> PARENT_ACTIVITY_NAME : " + PARENT_ACTIVITY_NAME);
			
			// 호출한 부모 activity 의 파라메터를 세팅 한다.
//			if(("DayveItemView").equals(PARENT_ACTIVITY_NAME)) {
//				DayveItemView.RESULT_ITEM_REGISTER = "SUCCESS";
//			} else if(("DayveCategoryAnalysisView").equals(PARENT_ACTIVITY_NAME)) {
//				DayveCategoryAnalysisView.RESULT_ITEM_REGISTER = "SUCCESS";
//			}
			
			DayveItemView.RESULT_ITEM_REGISTER = "SUCCESS";
			DayveCategoryAnalysisView.RESULT_ITEM_REGISTER = "SUCCESS";
			DayveCategoryView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			DayveFavoriteView.RESULT_CATEGORY_REGISTER = "SUCCESS";
			
//			DayveCategoryView.ACTIVITY_RESULT = "";

			Intent i = new Intent();
			setResult(RESULT_OK, i);
			
			/**
			 * category 를 등록한뒤 intent 로 생성하면 main 페이지가 사라진다.
			 * 등록 성공하면 본 register 페이지만 닫는다.
			 */
			// category 목록 화면으로 이동 한다.
//			Intent dayveMainView = new Intent(DayveCategoryRegisterView.this, DayveCategoryView.class);
//			startActivity(dayveMainView);
			
//			finish();
		} else {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_ITEM_EVENT_REGISTER_FAIL));
		}
	}
	
	/**
	 * Item Event 목록을 업데이트 한다.
	 * 
	 * 실제 로직은 updateItemEventList 메소드에서 처리한다.
	 * 쓰레드로 돌리기 위한 임시 메소드 이다.
	 */
	private void threadUpdateItemEventList() {
		Log.i(TAG, "threadUpdateItemEventList");
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				updateItemEventList();
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * Item Event 목록을 업데이트 한다.
	 */
	private void updateItemEventList() {
		Log.i(TAG, "updateItemEventList");
		
		/**
		 * refresh 실행하는 동안 버튼을 숨긴다.
		 */
//		mHandler.sendMessage(mHandler.obtainMessage(THREAD_REFRESH_BUTTON_DISAPPEAR));
		
		/**
		 * database 를 open 한다.
		 */
		dayveItemEventDatabaseHandler = DayveItemEventDatabaseHandler.open(getApplicationContext());
		
		// 기존의 데이터를 삭제 한다.
		dayveItemEventDatabaseHandler.deleteDayveItemEvent();
		dayveItemEventDatabaseHandler.close();

		DayveItemEvent parameterItemEvent = new DayveItemEvent();
		
		parameterItemEvent.setActivateYn("Y");
		parameterItemEvent.setMyHistoryMembersId(DAYVE_ID);
//		parameterItemEvent.setMyHistoryItemsIdMyHistoryItems(itemId);
//		parameterItemEvent.setItemStart(0);
//		parameterItemEvent.setItemCount(1000000);			// 한번에 모두 가져 오기 위해서 10000000.
		
		dayveItemEventDatabaseHandler = DayveItemEventDatabaseHandler.open(getApplicationContext());
		dayveItemEventDatabaseHandler.beginTransaction();
		
		try {
			itemEventList = dayveItemEventRest.selectItemEventList(parameterItemEvent);
			
			Log.i(TAG, "itemEventList.size() : " + itemEventList.size());
			
			for(int i=0 ; i<itemEventList.size() ; i++) {
				ContentValues values = new ContentValues();
				
				values.put("id_myhistory_item_events", itemEventList.get(i).getIdMyHistoryItemEvents());
				values.put("comment", itemEventList.get(i).getComment());
				values.put("amount", itemEventList.get(i).getAmount());
				values.put("open_item_event_yn", itemEventList.get(i).getOpenItemEventYn());
				values.put("favorite_yn", itemEventList.get(i).getFavoriteYn());
				values.put("activate_yn", itemEventList.get(i).getActivateYn());
				values.put("modify_date", itemEventList.get(i).getModifyDate());
				values.put("register_date", itemEventList.get(i).getRegisterDate());
				values.put("myhistory_members_id", itemEventList.get(i).getMyHistoryMembersId());
				values.put("myhistory_items_id_myhistory_items", itemEventList.get(i).getMyHistoryItemsIdMyHistoryItems());
				
				dayveItemEventDatabaseHandler.insertDayveItemEvent(values);
			}
			
			dayveItemEventDatabaseHandler.setTransactionSuccessful();
			
			Log.i(TAG, "Success to select item event list.");
			
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
//			dbHandler.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
//			dbHandler.close();
		} finally {
			dayveItemEventDatabaseHandler.endTransaction();
			
			if(dayveItemEventDatabaseHandler != null) {
				dayveItemEventDatabaseHandler.close();
			}
		}
		
		/**
		 * database 를 close 한다.
		 */
		if(dayveItemEventDatabaseHandler != null) {
			dayveItemEventDatabaseHandler.close();
		}
		
		/**
		 * refresh 종료되면 버튼을 출력 한다.
		 */
//		mHandler.sendMessage(mHandler.obtainMessage(THREAD_REFRESH_BUTTON_APPEAR));
				
		/**
		 * 스크롤 이벤트에 의한 페이지 처리를 하지 않는다. 주석 처리 함.
		 * 출력 부분에서 직접 처리 함.
		 */
//		requestCount++;
//		itemStart = requestCount * itemCount;
		
		/**
		 * 출력하기 직전 기존의 화면 목록을 지운다.
		 */
//		itemEventViewList.clear();
		
		// server 에서 가져온 목록을 database 에 저장하면 화면에 출력 한다.
//		mHandler.sendMessage(mHandler.obtainMessage(THREAD_ITEM_EVENT_LIST));
		
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_ITEM_EVENT_LIST));
	}

	/* (non-Javadoc)
	 * @see android.app.Activity#onActivityResult(int, int, android.content.Intent)
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		
		if(requestCode == 0) {
			if(resultCode == RESULT_OK) {
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_ITEM_EVENT_UPDATE));
			}
		}
	}

	/* (non-Javadoc)
	 * @see android.app.Activity#onResume()
	 */
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		
		Log.i(TAG, "onResume RESULT_UPDATE_ITEM_EVENT : " + RESULT_UPDATE_ITEM_EVENT);
		
		if(("").equals(RESULT_UPDATE_ITEM_EVENT)) {
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_ITEM_EVENT_LIST));
		}

		// main thread 에서 child thread 를 호출 한다.
		Thread thread = new Thread(null, insertLogBackgroundThreadProcessing, "Background_insertLog");
		thread.start();
		
		RESULT_UPDATE_ITEM_EVENT = "";
	}

	/* (non-Javadoc)
	 * @see android.app.Activity#onStop()
	 */
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		
		if(categoryDatabaseHandler != null) {
			categoryDatabaseHandler.close();
		}
		
		if(dayveItemEventDatabaseHandler != null) {
			dayveItemEventDatabaseHandler.close();
		}
	}
	
	/* 최상위 프로세스가 아닐 경우 프로세스를 종료 한다.
	 * 
	 * => Home Key 를 눌렀을때 프로세스를 종료 한다.
	 * 
	 * @see android.app.Activity#onPause()
	 */
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		
		if(!isForegrdound()) {
			DayveItemView.activity.finish();
			System.exit(0);
		}
	}
	
	/**
	 * 현재 프로세스가 최상위로 실행중인지 검사 한다.
	 * 
	 * true : 최상위
	 * 
	 * @return
	 */
	public boolean isForegrdound() {
	    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
	    List<RunningTaskInfo> list = am.getRunningTasks(1);
	    ComponentName cn = list.get(0).topActivity;
	    String name = cn.getPackageName();
	     
	    return name.indexOf(getPackageName()) > -1;
	}
	
	/**
	 * Item Event 목록을 가져 온다.
	 * 
	 * 등록된 날짜의 역순으로 가져 온다.
	 */
	private Runnable selectItemEventList = new Runnable() {

		public void run() {
			Log.i(TAG, "selectItemEventList");
			
			// TODO Auto-generated method stub
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));

			dayveItemEventDatabaseHandler = DayveItemEventDatabaseHandler.open(getApplicationContext());

			String _id = "0";
			
			int listSize = itemEventViewList.size();
			
			if(listSize > 0 ) {
				_id = itemEventViewList.get(listSize-1).get_id();
			}
			
			Log.i(TAG, "itemId : " + itemId);
			
			ArrayList<DayveItemEvent> resultList = dayveItemEventDatabaseHandler.selectItemEventList(itemId);
			itemEventViewList.addAll(resultList);
			
			if(resultList.size() < 1) {
				showNoListToast();
			}

			dayveItemAmountAdapter.notifyDataSetChanged();
			
			dayveItemEventDatabaseHandler.close();
			
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		}
		
	};
	
	/**
	 * 출력할 목록이 없다는 Toast 를 띄운다.
	 */
	private void showNoListToast() {
		CharSequence text = "리스트가 없습니다";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/**
	 * 로그를 저장 한다.
	 */
	private void insertLog() {
		Log.i(TAG, "insertLog");
		
		DayveLog dayveLog = new DayveLog();
		
		dayveLog.setId(DAYVE_ID);
		dayveLog.setViewName(TAG);
		dayveLog.setAccessDate(currentDate);
		
		try {
			dayveCommonRest.registerLog(dayveLog);
			Log.i(TAG, "Success to insert log.");
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		}
	}
	
	/**
	 * 로그 저장은 UI 와 관계 없기 때문에 background thread 로 구현 함 : child thread
	 */
	private Runnable insertLogBackgroundThreadProcessing = new Runnable() {
		
		public void run() {
			// TODO Auto-generated method stub
			insertLog();
		}
	};
}
